二、数据结构
部分一:
1、图有几种存储方式?邻接矩阵与邻接表存储结构的优缺点?什么时候用什么结构?
2、(1)排序算法哪些是稳定排序?归并排序常用于哪里?
(2)你所知道的最快的排序算法?
(3)若在数据库底层进行排序,该如何设计排序算法?
(4)快排的思路,手写快排
(5)堆排序
(6)排序算法
(7)希尔排序
(8)O(nlogn)的排序算法,选一个(写的堆排)
(9)知道的所有排序,及其时空复杂度和是否稳定
(10)排序为什么分稳定不稳定
(11)设计一个排序类,你会选用哪种排序算法,为什么
常用排序的时间复杂度和优缺点
(12) 那你说下排序算法吧
- 这个也是我之前仔细研究过的。我把经典的八大排序的原理、时间复杂度、空间复杂度、稳定性都仔细说了一遍。(注意不要直接说答案,最好是能分享,这样面试官才知道你是真正理解了)
- 我还回答了通排序(基数排序、计数排序)的原理以及和八大排序做了对比。
2、查找的复杂度
查找算法
3、(1)手写斐波那契数列?
(2)为什么不用递归?递归有什么不好?那为什么不用inline来写递归呢?如何来避免递归?
4、网络字节序与主机字节序的区别?为何要有这样的区别?
5、内存对齐,为什么要内存对齐
6、常见的页面置换算法?
7、(1)循环与递归的区别
(2)什么是递归,递归的几个条件?写递归要注意些什么?
8、二叉树给出前序,中序求后序
9、字符串匹配,O(n+m)
字符串匹配(可以用KMP),本人写的KMP
10、给一个单链表如何判断有环?
11、用什么数据结构保存cookie
12、手写vector删除元素,需要注意迭代器失效情况。
13、一致性哈希
14、(1)如何判断一个图是否有环
(2)如何判断一个单链表是否有环?
15、(1)红黑树查找、删除、增加的复杂度,为什么?
(2)红黑树 特性和与AVL数比较 B树比较
16、哈希表
17、堆结构
18、(1)二叉排序树的插入算法(手写)
(2)二叉树先序遍历(手写)
19(1)链表判断环的入口
(2)怎么判断两个链表是否相交
20、 java 几种修饰符 的区别
21、说一下对B+树的了解
22、 索引有哪些?分别有什么特点?
23、 HashMap问题
针对HashMap中某个Entry链太长,查找的时间复杂度可能达到O(n),怎么优化?
当时说了可能是容量或者hash算法的原因,说了扩容,寻找好的hash算法替代,然后面试官说不是这两个原因造成的,当时LZ也不知道JDK8中是采用红黑树进行处理的,就想不是为了降低查找时间复杂度吗,就说了用有序数组存储链表的数据,也就想到用有序数组查找的时间复杂度为O(nlogn )来解决,也是病急乱投医吧,最后面试官说也算是一种方法吧。
24、拓扑排序思想
25、 hash冲突的四种办法
26、中序遍历的非递归做法?引出BFS和DFS的区别
27、什么情况会栈溢出
28、B+树和二叉树查找时间复杂度
29、常用的hash算法有哪些
30、如果想实现一个线程安全的队列,可以怎么实现?
JUC包里的ArrayBlockingQueue 还有LinkedBlockingQueue啥的又结合源码说了一通。
部分二:
1. 链表与数组。
2.队列和栈,出栈与入栈。
3. 链表的删除、插入、反向。
4. 字符串操作。
5. Hash表的hash函数,冲突解决方法有哪些。
6. 各种排序:冒泡、选择、插入、希尔、归并、快排、堆排、桶排、基数的原理、平均时间复杂度、最坏时间复杂度、空间复杂度、是否稳定。
7. 快排的partition函数与归并的Merge函数。
8. 对冒泡与快排的改进。
9. 二分查找,与变种二分查找。
10. 二叉树、B+树、AVL树、红黑树、哈夫曼树。
11. 二叉树的前中后续遍历:递归与非递归写法,层序遍历算法。
12. 图的BFS与DFS算法,最小生成树prim算法与最短路径Dijkstra算法。
13. KMP算法。
14. 排列组合问题。
15. 动态规划、贪心算法、分治算法。(一般不会问到)
16. 大数据处理:类似10亿条数据找出最大的1000个数.........等等
部分三:
1、给你一万个数,如何找出里面所有重复的数?用所有你能想到的方法,时间复杂度和空间复杂度分别是多少?
2、给你一个数组,如何里面找到和为K的两个数?
3、100000个数找出最小或最大的10个?
4、一堆数字里面继续去重,要怎么处理?
5、利用数组,实现一个循环队列类
6、 从N个无序数中寻找Top-k个最小数( 经典海量数据 )?
7、1G的内存可以装入2G的程序么?怎么装?
8、n级台阶问题
9、手写代码,有序数组查找某个元素出现的次数
10、手写螺旋矩阵打印
11、象棋中马走日从A点到B点的最短路径走法
12、长为N的数组,元素范围是0-N-1,其中只有一个数是重复的,找出这个重复元素
13、矩阵从左上角向右下角走,每次只能向右或者向下移动,求经过最大的路径
14、数n可以由完全平方数构成,求最小的完全平方数构成数。
15、(1)两个栈实现一个队列
(2)怎么找出数组中出现两次的数(有两个数出现两次,其他的都是一次)
(3)旋转数组的最小值
(4)O(1)时间复杂度删除单链表结点
(5)约瑟夫环问题推导
(6)O(1)实现取栈的最小
16、给定一个2叉树,打印每一层最右边的结点
17、给定一个数组,里面只有一个数出现了一次,其他都出现了两次。怎么得到这个出现了一次的数?
18、在6基础上,如果有两个不同数的出现了一次,其他出现了两次,怎么得到这两个数?
19、无重复数组找出第K大的数字 引出堆排序(是否稳定,时间/空间复杂度)
20、 给定n个数,寻找第k小的数,同时给出时间复杂度
21、比较常见的算法题,也要考虑到n的大小,说了排序,最大堆,以及partition算法,面试官还让说,我说就知道这几种
22、对10G个数进行排序,限制内存为1G
大数问题,但是这10G个数可能是整数,字符串以及中文改如何排序,对中文排序没有回答出来。
23、 链表删去指定值的节点
23、 写一个类似解析字符串的小程序(感觉考点是正则表达式)
24、求两个int数组的并集、交集
25、11个汉诺塔问题,打印出转移路径,接着写一个二叉树前序遍历的代码,最后让写一个多叉树实现,并层次遍历的代码